﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace Dashboard.Common
{
    /// <summary>
    /// View与Model的双向数据绑定的基础类，
    /// 为了能够实现双向数据绑定，需要实现接口：INotifyPropertyChanged
    /// </summary>
    public class NotifyBase : INotifyPropertyChanged
    {
        /// <summary>
        /// 实现INotifyPropertyChanged接口必须在本类包含此成员（事件）
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Model中数据变动时触发：通知View
        /// View中的数据变动时触发：通知Model
        /// 
        /// 属性前的CallerMemberName自动化绑定属性名称，鼠标悬停CallerMemberName上即可看到其作用
        /// 以此可以简化调用步骤，调用时不用每次都由手动编写代码来传入变动数据的属性名称，而是自动调用者方法的方法名或调用者属性的属性名
        /// 为配合CallerMemberName，所以参数propertyName需要设定默认值（否则无法引用CallerMemberName标记）
        /// </summary>
        /// <param name="propertyName">被变动数据的属性名称</param>
        public void DoNotify([CallerMemberName]string propertyName = "")
        {
            /// 若变动事件不为空，则执行该事件
            /// 传递参数一：事件发起者（this）
            /// 传递参数二：事件的参数（通过变动数据的属性名称构造事件参数）
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
